<?php
/**
 * 功能：menu表模型
 * 作者：魏安来
 * 日期：2017/01/09
 */

namespace app\index\model;
use think\Model;
use think\Db;
use app\index\controller\Auth;

class Menu extends Model {

	/**
	 * 查找所有排序后的菜单，即一级后面跟的是二级菜单的数据，一次类推
	 * @return array $menuArr 排序后的菜单数据
	 */
	public function getAllMenu() {
		$data = Db::name('menu')->where('is_show',1)->order('sort asc')->select();
		$menuArr = $this->menuSort($data);
		return $menuArr;
	}

	/**
	 * 查找登录用户有权限的菜单
	 *@param int $uid
	 * @return array $menuArr
	 */
	public function hasAuthMenu($uid) {
		//获取用户所属角色
		$auth = new Auth();
		$data = $auth->getGroups($uid);
		$rules = $data[0]['rules'];
		$authList = $auth->getAuthList($uid,1);
		$tempArr = Db::name('menu')->where('is_show',1)->select();
		foreach ($tempArr as $val) {
			//用菜单的id作为数组索引
			$nameArr[$val['id']] = $val['controller'].'/'.$val['method'];
		}
		$authMenuId = '';
		//遍历出有权限的菜单id
		foreach ($nameArr as $k=>$v) {
			if (in_array($v, $authList)) {
				$authMenuId .= $k.',';
			}
		}
		$authMenuId = substr($authMenuId,0,-1);
		$authMenuData = Db::name('menu')->where('id', 'in', $authMenuId)->order('sort asc')->select();	
		$authMenu = $this->menuSort($authMenuData);
		return $authMenu;
	}

	/**
	 * 菜单排序
	 * @param array $data 需要排序的数据
	 * @param int 	$pid 上级菜单id
	 * @param int 	$level 菜单级别
	 * @return array $tempArr 排序后的菜单数据
	 */
	public function menuSort($data, $pid=0, $level = 0){
		//注意此处为递归，需要声明静态数组，否则会被初始化
		static	$tempArr = array();
		foreach ($data as $k=>$v) {
			if ($pid == $v['pid']) {
				$tempArr[$k] = $v;
				$tempArr[$k]['level'] = $level + 1;
				$this->menuSort($data, $v['id'], $tempArr[$k]['level']);
			}
		}
		return $tempArr;
	}

	/**
	 * 根据传入的ID获取一条菜单数据
	 * @param int $id 菜单id
	 * @return 一条菜单数据结果集
	 */
	public function getOneMenuData($id) {
		return Db::name('menu')->where('id', $id)->find();
	}

	/**
	 * 根据ID和$data更新一条菜单数据
	 * @param int 	$id 菜单id
	 * @param array $data 菜单数据
	 * @return int $affected 受影响的行数
	 */
	public function updataOneMenuData($id, $data) {
		$affected = Db::name('menu')->where('id', $id)->update($data);
		return $affected;
	}

	/**
	 * 根据ID删除菜单数据
	 * @param int $id 菜单id
	 * @return int $affected 受影响的行数
	 */
	public function deleteMenu($id) {
		static $affected = 0;
		//查找子菜单，先删除子菜单，再删除这个菜单
		$result = Db::name('menu')->where('pid', $id)->select();
		if ($result) {
			foreach($result as $v){
				//递归删除
				$affected += Db::name('menu')->delete($id);
				$this->deleteMenu($v['id']);
			}
		} else {
			//如果没有子菜单，直接根据主键id删除
			$affected += Db::name('menu')->delete($id);
		}
		return $affected;
	}

}

?>